home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / mondisk.arc / MONDISK.ASM next >
Encoding:
Assembly Source File  |  1985-06-26  |  4.9 KB  |  178 lines

  1.         TITLE    MONITOR DISK ACTIVITIES
  2.  
  3.        ;-------------------------------------------;
  4.        ;                                           ;
  5.        ; MONDISK was written by Scott Pakin, 1985. ;
  6.        ; This program may be distributed freely.   ;
  7.        ;                                           ;
  8.        ;-------------------------------------------;
  9.  
  10. INTERRUPTS      SEGMENT AT 0H   ;This is where the disk interrupt
  11.         ORG     13H*4            ;is located
  12. DISK_INT    LABEL   DWORD
  13. INTERRUPTS      ENDS
  14.  
  15. CODE_SEG        SEGMENT
  16.         ASSUME  CS:CODE_SEG
  17.         ORG     100H            ;ORG = 100H to make this into a .COM file
  18. FIRST:  JMP     INIT        ;First time through jump to initialize routine
  19.  
  20. OLD_DISK_INT    DD    ?
  21.  
  22. MSG1:    DB    13,10
  23.     DB    'MONITOR DISK ACTIVITIY',13,10
  24.         DB    '  by Scott Pakin',13,10,10
  25.         DB    'All disk activities will be shown in the upper lefthand',13,10
  26.         DB    'corner of the screen. The codes are as follows:',13,10
  27.         DB    '    R = reading',13,10
  28.         DB    '    W = writing',13,10
  29.         DB    '    V = verifying',13,10
  30.         DB    '    F = formatting',13,10
  31.         DB    'Note: This program probably will not work with most RAM disks.'
  32.         DB    13,10,10,'$'
  33.  
  34. DSK    PROC    NEAR            ;The disk interrupt will now come here.
  35.         ASSUME  CS:CODE_SEG
  36.         PUSH    AX              ;Save the used registers for good form
  37.         PUSH    BX
  38.         PUSH    CX
  39.         PUSH    DX
  40.         PUSH    DI
  41.         PUSH    SI
  42.         PUSH    DS
  43.         PUSH    ES
  44.         PUSHF
  45.  
  46.     PUSH    DX        ;SAVE A FEW OTHER THINGS
  47.         PUSH    CX
  48.     PUSH    BX
  49.         PUSH    AX
  50.         JMP    THERE
  51.  
  52. ATTR    DW    ?    ;LOCATION FOR CHARACTER/ATTRIBUTE
  53. DX1    DW    ?
  54. CX1    DW    ?
  55. AX1    DW    ?
  56. FLAGS1    DB    ?
  57.  
  58. THERE:    XOR    BH,BH        ;GET CURSOR POSITION
  59.     MOV    AH,3
  60.         INT    10H
  61.         MOV    CX1,CX        ;SAVE IT
  62.         MOV    DX1,DX
  63.         MOV    DH,0        ;MOVE CURSOR TO UPPER LEFT
  64.         MOV    DL,79
  65.         MOV    AH,2
  66.         INT    10H
  67.         MOV    AH,8        ;READ ATTRIBUTE/CHARACTER
  68.         INT    10H
  69.         MOV    ATTR,AX        ;SAVE IT
  70.  
  71.     POP    AX        ;GET REQUEST
  72.         PUSH    AX        ;SAVE IT AGAIN
  73.     CMP    AH,1        ;RESET OR STATUS --
  74.         JLE    OLD_R        ;DON'T DO ANYTHING SPECIAL
  75.  
  76.         CMP    AH,2        ;READ?
  77.         JNE    C1        ;NO -- CONTINUE
  78.         MOV    BL,15        ;HIGH INTENSITY
  79.         MOV    CX,1        ;WRITE ONE CHARACTER
  80.         MOV    AL,'R'        ;AN "R"
  81.         MOV    AH,9
  82.         INT    10H
  83.         JMP    OLD_R
  84.  
  85. C1:     CMP    AH,3        ;WRITE?
  86.         JNE    C2        ;NO -- CONTINUE
  87.         MOV    BL,15        ;HIGH INTENSITY
  88.         MOV    CX,1        ;WRITE ONE CHARACTER
  89.         MOV    AL,'W'        ;A "W"
  90.         MOV    AH,9
  91.         INT    10H
  92.         JMP    OLD_R
  93.  
  94. C2:     CMP    AH,4        ;VERIFY?
  95.         JNE    C3        ;NO -- CONTINUE
  96.         MOV    BL,15        ;HIGH INTENSITY
  97.         MOV    CX,1        ;WRITE ONE CHARACTER
  98.         MOV    AL,'V'        ;A "V"
  99.         MOV    AH,9
  100.         INT    10H
  101.         JMP    OLD_R
  102.  
  103. C3:     CMP    AH,5        ;FORMAT?
  104.         JNE    OLD_R        ;NO -- CONTINUE
  105.         MOV    BL,15        ;HIGH INTENSITY
  106.         MOV    CX,1        ;WRITE ONE CHARACTER
  107.         MOV    AL,'F'        ;AN "F"
  108.         MOV    AH,9
  109.         INT    10H
  110.  
  111. OLD_R:    POP    AX        ;RECALL REQUEST
  112.     POP    BX
  113.     POP    CX
  114.         POP    DX
  115.     CALL    OLD_DISK_INT    ;CALL OLD ROUTINE
  116.         MOV    AX1,AX
  117.         LAHF
  118.         MOV    FLAGS1,AH
  119.  
  120.     MOV    AX,ATTR        ;GET OLD ATTRIBUTE
  121.         MOV    BL,AH
  122.         MOV    CX,1
  123.         XOR    BH,BH
  124.         MOV    AH,9
  125.         INT    10H
  126.  
  127.     MOV    CX,CX1        ;RESTORE CURSOR POSITION
  128.         MOV    DX,DX1
  129.         MOV    AH,2
  130.         INT    10H
  131.  
  132. OUT:    POP     ES                ;Having done Pushes, here are the Pops
  133.         POP     DS
  134.         POP     SI
  135.         POP     DI
  136.         POP     DX
  137.         POP     CX
  138.         POP     BX
  139.         POP     AX     
  140.  
  141.     POP    DX        ;REALLY IP
  142.         POP    CX        ;REALLY CS
  143.         POPF
  144.         MOV    AH,FLAGS1
  145.         SAHF
  146.         PUSHF
  147.         PUSH    CX
  148.         PUSH    DX
  149.         MOV    AX,AX1
  150.         IRET                    ;An interrupt needs an IRET
  151. DSK     ENDP
  152.  
  153. INIT        PROC    NEAR    ;This procedure intializes everything
  154.  
  155.     LEA    DX,MSG1        ;Print initial message
  156.         MOV    AH,9
  157.         INT    21H
  158.  
  159.         ASSUME  DS:INTERRUPTS   ;The data segment will be the Interrupt area
  160.         MOV     AX,INTERRUPTS
  161.         MOV     DS,AX
  162.         
  163.         MOV     AX,DISK_INT         ;Get the old interrupt service routine
  164.         MOV     OLD_DISK_INT,AX     ;address and put it into our location
  165.         MOV     AX,DISK_INT[2]      ;OLD_DISK_INT so we can call it.
  166.         MOV     OLD_DISK_INT[2],AX
  167.         
  168.         MOV     DISK_INT,OFFSET DSK  ;Now load the address of our notepad
  169.         MOV     DISK_INT[2],CS         ;routine into the disk interrupt
  170.                                         
  171. EXIT:   MOV     DX,OFFSET INIT          ;Set up everything but INIT to
  172.         INT     27H                     ;stay and attach itself to DOS
  173. INIT        ENDP
  174.  
  175.         CODE_SEG        ENDS
  176.         
  177.         END     FIRST            ;END "FIRST" so 8088 will go to FIRST first.
  178.